/*
? Promise.allSettled  是 JavaScript 中的一种方法，它接受一个 Promise 迭代器，并返回一个 Promise。
? 该 Promise 将在所有的 Promise 都已完成（无论是状态为完成状态还是拒绝状态）后被解决。
? 返回的 Promise 将被解决为一个对象数组，该数组表示每个 Promise 的状态。
? 每个对象包含两个属性：状态（表示 Promise 是否已解决，拒绝或等待）以及值或原因（表示 Promise 的执行结果）
? 这个是为了解决Promise.all无法返回所有Promise执行状态而设计的
 */
Promise.myAllSettled = function (proms) {
    return new Promise((resolve, reject) => {
        let settledCount = 0; //状态已经确定的promise数
        let count = 0; //promise总数
        const result = [];
        for (const prom of proms) {
            let i = count;
            count++;
            Promise.resolve(prom).then(
                // 参数1：resolve
                (data) => {
                    settledCount++;
                    // 数据记录状态和值
                    result[i] = {
                        status: "fulfilled",
                        value: data,
                    };
                },
                // 参数2：reject
                (reason) => {
                    settledCount++;
                    // 数据记录状态和值
                    result[i] = {
                        status: "rejected",
                        reason,
                    };
                }
                // 无论如何 执行
            ).finally(() => {
                // 全部处理完了执行resolve函数 参数为result 这里当然是为了使then()里的回调函数生效(resolve会触发里面回调函数)
                if(settledCount >= count){
                    resolve(result)
                }
            });
        }
    });
};

const pro = new Promise((resolve, reject) => {
    setTimeout(() => {
        reject(3);
    }, 1000);
});

Promise.allSettled([pro, Promise.resolve(1), Promise.reject(2)]).then(
    (data) => {
        console.log(data);
    }
);

Promise.myAllSettled([pro, Promise.resolve(1), Promise.reject(2)]).then(
    (data) => {
        console.log(data);
    }
);
